home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 November: Tool Chest / Dev.CD Nov 00 TC Disk 1.toast / Sample Code / Games / SoundSprocketTest / TS3TestLoLevel.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-28  |  46.1 KB  |  1,781 lines  |  [TEXT/MPS ]

  1. /*
  2.  *    File:        TS3TestLoLevel.c
  3.  *
  4.  *    Copyright © 1996 Apple Computer, Inc.
  5.  */
  6.  
  7. #include <assert.h>
  8. #include <math.h>
  9. #include <string.h>
  10.  
  11. #include <Dialogs.h>
  12. #include <Fonts.h>
  13. #include <Menus.h>
  14. #include <Timer.h>
  15. #include <fp.h>
  16.  
  17. #include "TS3Menu.h"
  18. #include "TS3Message.h"
  19. #include "TS3Resource.h"
  20. #include "TS3Sound.h"
  21. #include "TS3TestLoLevel.h"
  22. #include "TS3Utils.h"
  23. #include "TS3Window.h"
  24.  
  25. #include "SoundSprocket.h"
  26.  
  27.  
  28. typedef struct TTestLoLevelData {
  29.     float            duration;
  30.     
  31.     UInt32            cpuLoad1;
  32.     UInt32            cpuLoad2;
  33.     Boolean            cpuLoadRange;
  34.     
  35.     UInt32            medium;
  36.     
  37.     float            humidity1;
  38.     float            humidity2;
  39.     Boolean            humidityRange;
  40.     
  41.     float            roomSize1;
  42.     float            roomSize2;
  43.     Boolean            roomSizeRange;
  44.     
  45.     float            roomReflectivity1;
  46.     float            roomReflectivity2;
  47.     Boolean            roomReflectivityRange;
  48.     
  49.     float            reverbAttenuation1;
  50.     float            reverbAttenuation2;
  51.     Boolean            reverbAttenuationRange;
  52.     
  53.     UInt32            sourceMode;
  54.     
  55.     float            referenceDistance1;
  56.     float            referenceDistance2;
  57.     Boolean            referenceDistanceRange;
  58.     
  59.     float            coneAngleDeg1;
  60.     float            coneAngleDeg2;
  61.     Boolean            coneAngleDegRange;
  62.     
  63.     float            coneAttenuation1;
  64.     float            coneAttenuation2;
  65.     Boolean            coneAttenuationRange;
  66.     
  67.     float            elevationDeg1;
  68.     float            elevationDeg2;
  69.     Boolean            elevationDegRange;
  70.     
  71.     float            azimuthDeg1;
  72.     float            azimuthDeg2;
  73.     Boolean            azimuthDegRange;
  74.     
  75.     float            distance1;
  76.     float            distance2;
  77.     Boolean            distanceRange;
  78.     
  79.     float            projectionAngleDeg1;
  80.     float            projectionAngleDeg2;
  81.     Boolean            projectionAngleDegRange;
  82.     
  83.     float            sourceVelocity1;
  84.     float            sourceVelocity2;
  85.     Boolean            sourceVelocityRange;
  86.     
  87.     float            listenerVelocity1;
  88.     float            listenerVelocity2;
  89.     Boolean            listenerVelocityRange;
  90.     
  91.     float            coneAngleCos1;
  92.     float            coneAngleCos2;
  93.     
  94.     float            elevation1;
  95.     float            elevation2;
  96.     
  97.     float            azimuth1;
  98.     float            azimuth2;
  99.     
  100.     float            projectionAngle1;
  101.     float            projectionAngle2;
  102. } TTestLoLevelData;
  103.  
  104.  
  105. static MenuHandle                gTestLoLevelPresetMenu            = NULL;
  106. static DialogPtr                gTestLoLevelDialog                = NULL;
  107. static UserItemUPP                gTestLoLevelProgressUserItem    = NULL;
  108. static UInt32                    gTestLoLevelCPULoadLimit;
  109. static TTestLoLevelData            gTestLoLevelData;
  110.  
  111. static UnsignedWide                gTestLoLevelCycleStart;
  112. static float                    gTestLoLevelInterpolant            = 0.0;
  113.  
  114.  
  115. static WindowMethodPtr TestLoLevel_MetaHandler(
  116.     WindowMethod        inMethod);
  117.  
  118. static void TestLoLevel_GetSleep(
  119.     WindowPtr            inWindow,
  120.     UInt32*                outSleep);
  121.  
  122. static void TestLoLevel_ConsumeEvent(
  123.     WindowPtr            inWindow,
  124.     const EventRecord*    inEvent,
  125.     Boolean*            outConsumed);
  126.  
  127. static void TestLoLevel_Update(
  128.     WindowPtr            inWindow);
  129.  
  130. static void TestLoLevel_Activate(
  131.     WindowPtr            inWindow);
  132.  
  133. static void TestLoLevel_Deactivate(
  134.     WindowPtr            inWindow);
  135.  
  136. static pascal void TestLoLevel_ProgressUserItem(
  137.     DialogPtr            inDialog,
  138.     short                inItem);
  139.  
  140. static void TestLoLevel_Interpolate(
  141.     void);
  142.  
  143. static float TestLoLevel_DoInterpolate(
  144.     float                inWhere,
  145.     float                inVal0,
  146.     float                inVal1,
  147.     Boolean                inIsRange);
  148.  
  149. static void TestLoLevel_DeriveData(
  150.     void);
  151.  
  152. static void TestLoLevel_SetDialogFields(
  153.     void);
  154.  
  155. static void TestLoLevel_GetDialogFields(
  156.     void);
  157.  
  158.  
  159. /* =============================================================================
  160.  *        TestLoLevel_Init (external)
  161.  *
  162.  *    Initializes our thing.
  163.  * ========================================================================== */
  164. void TestLoLevel_Init(
  165.     void)
  166. {
  167.     OSStatus            err;
  168.     TEHandle            textEdit;
  169.     FontInfo            fontInfo;
  170.     short                itemType;
  171.     Handle                itemHandle;
  172.     Rect                itemBounds;
  173.     Str255                str;
  174.     short                 fNum;
  175.     
  176.     // Make sure we didn't mess up the dialog items
  177.     assert(kLoLevelItem_COUNT == kLoLevelItem_ExpectedCOUNT);
  178.     
  179.     // Grab the maximum CPU load limit value
  180.     gTestLoLevelCPULoadLimit = 999;
  181.     err = SSpGetCPULoadLimit(&gTestLoLevelCPULoadLimit);
  182.     Message_CheckError(err, "TestLoLevel_Init", "SSpGetCPULoadLimit");
  183.     
  184.     //• TODO: Read in gTestLoLevelData from preferences
  185.     
  186.     // Grab the menu
  187.     gTestLoLevelPresetMenu = GetMenu(kMenuID_LoLevelPreset);
  188.     
  189.     // Grab the dialog
  190.     gTestLoLevelDialog = GetNewDialog(kDlogID_LoLevel, NULL, (WindowPtr) -1);
  191.     assert(gTestLoLevelDialog != NULL);
  192.     
  193.     SetPort(gTestLoLevelDialog);
  194.     GetFNum("\pGeneva", &fNum);
  195.     TextFont(fNum);
  196.     TextSize(10);
  197.     
  198.     // Fix up the line height
  199.     GetFontInfo(&fontInfo);
  200.     
  201.     textEdit = ((DialogPeek) gTestLoLevelDialog)->textH;
  202.     
  203.     (*textEdit)->lineHeight = fontInfo.ascent+fontInfo.descent+fontInfo.leading;
  204.     (*textEdit)->fontAscent = fontInfo.ascent;
  205.     
  206.     // Set up our method table
  207.     Window_New(gTestLoLevelDialog, TestLoLevel_MetaHandler);
  208.     
  209.     // Do the user items
  210.     GetDialogItem(gTestLoLevelDialog, kLoLevelItem_UpdateHilite, &itemType, &itemHandle, &itemBounds);
  211.     SetDialogItem(gTestLoLevelDialog, kLoLevelItem_UpdateHilite, itemType, (Handle) Utils_GetOKUserItemProc(), &itemBounds);
  212.     
  213.     gTestLoLevelProgressUserItem = NewUserItemProc(TestLoLevel_ProgressUserItem);
  214.     assert(gTestLoLevelProgressUserItem != NULL);
  215.     
  216.     GetDialogItem(gTestLoLevelDialog, kLoLevelItem_Progress, &itemType, &itemHandle, &itemBounds);
  217.     SetDialogItem(gTestLoLevelDialog, kLoLevelItem_Progress, itemType, (Handle) gTestLoLevelProgressUserItem, &itemBounds);
  218.     
  219.     // Show the quality limit
  220.     sprintf((char*) str, "x[0..%ld]", gTestLoLevelCPULoadLimit);
  221.     str[0] = strlen((char*) str)-1;
  222.     
  223.     GetDialogItem(gTestLoLevelDialog, kLoLevelItem_CPULoadUnits, &itemType, &itemHandle, &itemBounds);
  224.     SetDialogItemText(itemHandle, str);
  225.     
  226.     // Set the initial field values
  227.     TestLoLevel_Preset(1);
  228.     
  229.     // Select the first field
  230.     SelectDialogItemText(gTestLoLevelDialog, kLoLevelItem_Duration, 0, 32767);
  231.     
  232.     // Show the dialog
  233.     ShowWindow(gTestLoLevelDialog);
  234.     
  235.     // Initialize our cycle timer
  236.     Microseconds(&gTestLoLevelCycleStart);
  237. }
  238.  
  239.  
  240. /* =============================================================================
  241.  *        TestLoLevel_Exit (external)
  242.  *
  243.  *    Cleans up.
  244.  * ========================================================================== */
  245. void TestLoLevel_Exit(
  246.     void)
  247. {
  248.     //• TODO: Save gTestLoLevel to preferences
  249.     
  250.     if (gTestLoLevelDialog != NULL)
  251.     {
  252.         DisposeDialog(gTestLoLevelDialog);
  253.         gTestLoLevelDialog = NULL;
  254.     }
  255.     
  256.     if (gTestLoLevelProgressUserItem != NULL)
  257.     {
  258.         DisposeRoutineDescriptor(gTestLoLevelProgressUserItem);
  259.         gTestLoLevelProgressUserItem = NULL;
  260.     }
  261. }
  262.  
  263.  
  264. /* =============================================================================
  265.  *        TestLoLevel_MetaHandler (internal)
  266.  *
  267.  *    Returns the method function pointer that corresponds to the given ID.
  268.  * ========================================================================== */
  269. WindowMethodPtr TestLoLevel_MetaHandler(
  270.     WindowMethod        inMethod)
  271. {
  272.     WindowMethodPtr        result;
  273.     
  274.     result = NULL;
  275.     
  276.     switch (inMethod)
  277.     {
  278.         case kWindowMethod_GetSleep:
  279.             result = (WindowMethodPtr) TestLoLevel_GetSleep;
  280.         break;
  281.         
  282.         case kWindowMethod_ConsumeEvent:
  283.             result = (WindowMethodPtr) TestLoLevel_ConsumeEvent;
  284.         break;
  285.         
  286.         case kWindowMethod_Update:
  287.             result = (WindowMethodPtr) TestLoLevel_Update;
  288.         break;
  289.         
  290.         case kWindowMethod_Activate:
  291.             result = (WindowMethodPtr) TestLoLevel_Activate;
  292.         break;
  293.         
  294.         case kWindowMethod_Deactivate:
  295.             result = (WindowMethodPtr) TestLoLevel_Deactivate;
  296.         break;
  297.     }
  298.     
  299.     return result;
  300. }
  301.  
  302.  
  303. /* =============================================================================
  304.  *        TestLoLevel_GetSleep (internal)
  305.  *
  306.  *    Returns the sleep time to pass to WaitNextEvent when we're in front.
  307.  * ========================================================================== */
  308. void TestLoLevel_GetSleep(
  309.     WindowPtr            inWindow,
  310.     UInt32*                outSleep)
  311. {
  312.     #pragma unused (inWindow)
  313.     assert(outSleep != NULL);
  314.     
  315.     *outSleep = 0;
  316. }
  317.  
  318.  
  319. /* =============================================================================
  320.  *        TestLoLevel_ConsumeEvent (internal)
  321.  *
  322.  *    Called for each event when this is the front window.
  323.  * ========================================================================== */
  324. void TestLoLevel_ConsumeEvent(
  325.     WindowPtr            inWindow,
  326.     const EventRecord*    inEvent,
  327.     Boolean*            outConsumed)
  328. {
  329.     #pragma unused (inWindow)
  330.     short                itemType;
  331.     Handle                itemHandle;
  332.     Rect                itemBounds;
  333.     ControlHandle        updateButton;
  334.     Boolean                consumed;
  335.     Boolean                passToDialog;
  336.     WindowPtr            window;
  337.     short                item;
  338.     unsigned long        timeout;
  339.     UnsignedWide        now;
  340.     
  341.     assert(inEvent != NULL);
  342.     assert(outConsumed != NULL);
  343.     
  344.     consumed = false;
  345.     passToDialog = true;
  346.     
  347.     // We want to handle some events ourself
  348.     switch (inEvent->what)
  349.     {
  350.         case keyDown:
  351.         case autoKey:
  352.             passToDialog = false;
  353.             
  354.             if (inEvent->modifiers & cmdKey)
  355.             {
  356.                 if (inEvent->what != autoKey)
  357.                 {
  358.                     switch (inEvent->message & charCodeMask)
  359.                     {
  360.                         case '.':
  361.                             // anything here?
  362.                         break;
  363.                     }
  364.                 }
  365.             }
  366.             else
  367.             {
  368.                 switch (inEvent->message & charCodeMask)
  369.                 {
  370.                     case 0x08:  // backspace
  371.                     case 0x09:  // tab
  372.                     case 0x1C:  // cursor left
  373.                     case 0x1D:  // cursor right
  374.                     case 0x1E:  // cursor up
  375.                     case 0x1F:  // cursor down
  376.                     case '.':
  377.                     case '-':
  378.                     case '0':
  379.                     case '1':
  380.                     case '2':
  381.                     case '3':
  382.                     case '4':
  383.                     case '5':
  384.                     case '6':
  385.                     case '7':
  386.                     case '8':
  387.                     case '9':
  388.                         // Pass it to the dialog
  389.                         passToDialog = true;
  390.                     break;
  391.                     
  392.                     case 0x03:  // enter
  393.                     case 0x0D:  // return
  394.                         if (inEvent->what != autoKey)
  395.                         {
  396.                             // Update button equivalent
  397.                             GetDialogItem(gTestLoLevelDialog, kLoLevelItem_Update, &itemType, &itemHandle, &itemBounds);
  398.                             updateButton = (ControlHandle) itemHandle;
  399.                             
  400.                             if ((*updateButton)->contrlHilite == 0)
  401.                             {
  402.                                 HiliteControl(updateButton, 1);
  403.                                 
  404.                                 timeout = TickCount()+6;
  405.                                 while (TickCount() < timeout) /* wait */;
  406.                                 
  407.                                 HiliteControl(updateButton, 0);
  408.                                 
  409.                                 TestLoLevel_GetDialogFields();
  410.                                 
  411.                                 consumed = true;
  412.                             }
  413.                         }
  414.                     break;
  415.                     
  416.                     default:
  417.                         SysBeep(10);
  418.                         consumed = true;
  419.                 }
  420.             }
  421.         break;
  422.         
  423.         case activateEvt:
  424.             // We need to look at the activate event here because it is
  425.             // consumed by IsDialogEvent/DialogSelect below and so never
  426.             // gets to the window stuff
  427.             window = (WindowPtr) inEvent->message;
  428.             
  429.             if (inEvent->modifiers & activeFlag)
  430.             {
  431.                 Window_Activate(window);
  432.             }
  433.             else
  434.             {
  435.                 Window_Deactivate(window);
  436.             }
  437.         break;
  438.         
  439.         case nullEvent:
  440.             // Find where we are in the cycle (0 is start, 1 is end)
  441.             Microseconds(&now);
  442.             gTestLoLevelInterpolant = Utils_Interval(&gTestLoLevelCycleStart, &now) / gTestLoLevelData.duration;
  443.             
  444.             switch (Menu_GetInterpolation())
  445.             {
  446.                 case kInterpolationItem_Sinusoidal:
  447.                     gTestLoLevelInterpolant = 0.5*sinf(gTestLoLevelInterpolant*pi*2.0) + 0.5;
  448.                 break;
  449.                 
  450.                 case kInterpolationItem_Triangular:
  451.                     gTestLoLevelInterpolant = 2.0*fmodf(gTestLoLevelInterpolant, 1.0);
  452.                     
  453.                     if (gTestLoLevelInterpolant > 1.0)
  454.                     {
  455.                         gTestLoLevelInterpolant = 2.0-gTestLoLevelInterpolant;
  456.                     }
  457.                 break;
  458.                 
  459.                 case kInterpolationItem_Sawtooth:
  460.                     gTestLoLevelInterpolant = fmodf(2.0*gTestLoLevelInterpolant, 1.0);
  461.                 break;
  462.             }
  463.             
  464.             TestLoLevel_Interpolate();
  465.         break;
  466.     }
  467.     
  468.     // Do dialog stuff
  469.     if (passToDialog)
  470.     {
  471.         consumed = IsDialogEvent(inEvent);
  472.         if (consumed)
  473.         {
  474.             if (DialogSelect(inEvent, &window, &item))
  475.             {
  476.                 switch (item)
  477.                 {
  478.                     case kLoLevelItem_Update:
  479.                         TestLoLevel_GetDialogFields();
  480.                     break;
  481.                 }
  482.             }
  483.         }
  484.     }
  485.     
  486.     // Return the result
  487.     *outConsumed = consumed;
  488. }
  489.  
  490.  
  491. /* =============================================================================
  492.  *        TestLoLevel_Update (internal)
  493.  *
  494.  *    Updates the contents of the window.
  495.  * ========================================================================== */
  496. void TestLoLevel_Update(
  497.     WindowPtr            inWindow)
  498. {
  499.     DrawDialog(inWindow);
  500. }
  501.  
  502.  
  503. /* =============================================================================
  504.  *        TestLoLevel_Activate (internal)
  505.  *
  506.  *    Handles window activation.
  507.  * ========================================================================== */
  508. void TestLoLevel_Activate(
  509.     WindowPtr            inWindow)
  510. {
  511.     #pragma unused (inWindow)
  512.     InsertMenu(gTestLoLevelPresetMenu, 0);
  513.     DrawMenuBar();
  514. }
  515.  
  516.  
  517. /* =============================================================================
  518.  *        TestLoLevel_Deactivate (internal)
  519.  *
  520.  *    Handles window deactivation.
  521.  * ========================================================================== */
  522. void TestLoLevel_Deactivate(
  523.     WindowPtr            inWindow)
  524. {
  525.     #pragma unused (inWindow)
  526.     DeleteMenu(kMenuID_LoLevelPreset);
  527.     DrawMenuBar();
  528. }
  529.  
  530.  
  531. /* =============================================================================
  532.  *        TestLoLevel_ProgressUserItem (internal)
  533.  *
  534.  *    Draws the user item used for progress bar, based on gTestLoLevelInterpolant.
  535.  * ========================================================================== */
  536. pascal void TestLoLevel_ProgressUserItem(
  537.     DialogPtr            inDialog,
  538.     short                inItem)
  539. {
  540.     short                itemType;
  541.     Handle                itemHandle;
  542.     Rect                itemBounds;
  543.     short                size;
  544.     Rect                leftWhite;
  545.     Rect                rightWhite;
  546.     Rect                indicator;
  547.     
  548.     GetDialogItem(inDialog, inItem, &itemType, &itemHandle, &itemBounds);
  549.     
  550.     FrameRect(&itemBounds);
  551.     
  552.     InsetRect(&itemBounds, 1, 1);
  553.     size = itemBounds.bottom-itemBounds.top;
  554.     
  555.     indicator = itemBounds;
  556.     indicator.left = itemBounds.left + (long) (gTestLoLevelInterpolant*(itemBounds.right-itemBounds.left-size) + 0.5);
  557.     indicator.right = indicator.left+size;
  558.     
  559.     leftWhite = itemBounds;
  560.     leftWhite.right = indicator.left;
  561.     
  562.     rightWhite = itemBounds;
  563.     rightWhite.left = indicator.right;
  564.     
  565.     FrameRect(&indicator);
  566.     
  567.     InsetRect(&indicator, 1, 1);
  568.     FillRect(&indicator, &qd.gray);
  569.     
  570.     EraseRect(&leftWhite);
  571.     EraseRect(&rightWhite);
  572. }
  573.  
  574.  
  575. /* =============================================================================
  576.  *        TestLoLevel_Interpolate (internal)
  577.  *
  578.  *    Changes the sound channel to the correct values for the point between
  579.  *    zero and one determined by gTestLoLevelInterpolant.
  580.  * ========================================================================== */
  581. void TestLoLevel_Interpolate(
  582.     void)
  583. {
  584.     SSpLocalizationData            snd3DInfo;
  585.     float                        elevation;
  586.     float                        azimuth;
  587.     
  588.     snd3DInfo.cpuLoad = (UInt32) (TestLoLevel_DoInterpolate(
  589.             gTestLoLevelInterpolant,
  590.             (float) gTestLoLevelData.cpuLoad1,
  591.             (float) gTestLoLevelData.cpuLoad2,
  592.             gTestLoLevelData.cpuLoadRange) + 0.5);
  593.     
  594.     snd3DInfo.medium = gTestLoLevelData.medium;
  595.     
  596.     snd3DInfo.humidity = TestLoLevel_DoInterpolate(
  597.             gTestLoLevelInterpolant,
  598.             gTestLoLevelData.humidity1,
  599.             gTestLoLevelData.humidity2,
  600.             gTestLoLevelData.humidityRange);
  601.     
  602.     snd3DInfo.roomSize = TestLoLevel_DoInterpolate(
  603.             gTestLoLevelInterpolant,
  604.             gTestLoLevelData.roomSize1,
  605.             gTestLoLevelData.roomSize2,
  606.             gTestLoLevelData.roomSizeRange);
  607.     
  608.     snd3DInfo.roomReflectivity = TestLoLevel_DoInterpolate(
  609.             gTestLoLevelInterpolant,
  610.             gTestLoLevelData.roomReflectivity1,
  611.             gTestLoLevelData.roomReflectivity2,
  612.             gTestLoLevelData.roomReflectivityRange);
  613.     
  614.     snd3DInfo.reverbAttenuation = TestLoLevel_DoInterpolate(
  615.             gTestLoLevelInterpolant,
  616.             gTestLoLevelData.reverbAttenuation1,
  617.             gTestLoLevelData.reverbAttenuation2,
  618.             gTestLoLevelData.reverbAttenuationRange);
  619.     
  620.     snd3DInfo.sourceMode = gTestLoLevelData.sourceMode;
  621.     
  622.     snd3DInfo.referenceDistance = TestLoLevel_DoInterpolate(
  623.             gTestLoLevelInterpolant,
  624.             gTestLoLevelData.referenceDistance1,
  625.             gTestLoLevelData.referenceDistance2,
  626.             gTestLoLevelData.referenceDistanceRange);
  627.     
  628.     snd3DInfo.coneAngleCos = TestLoLevel_DoInterpolate(
  629.             gTestLoLevelInterpolant,
  630.             gTestLoLevelData.coneAngleCos1,
  631.             gTestLoLevelData.coneAngleCos2,
  632.             gTestLoLevelData.coneAngleDegRange);
  633.     
  634.     snd3DInfo.coneAttenuation = TestLoLevel_DoInterpolate(
  635.             gTestLoLevelInterpolant,
  636.             gTestLoLevelData.coneAttenuation1,
  637.             gTestLoLevelData.coneAttenuation2,
  638.             gTestLoLevelData.coneAttenuationRange);
  639.     
  640.     // Wrap the azimuth and elevation to fit in their ranges
  641.     elevation = TestLoLevel_DoInterpolate(
  642.             gTestLoLevelInterpolant,
  643.             gTestLoLevelData.elevation1,
  644.             gTestLoLevelData.elevation2,
  645.             gTestLoLevelData.elevationDegRange);
  646.     
  647.     azimuth = TestLoLevel_DoInterpolate(
  648.             gTestLoLevelInterpolant,
  649.             gTestLoLevelData.azimuth1,
  650.             gTestLoLevelData.azimuth2,
  651.             gTestLoLevelData.azimuthDegRange);
  652.     
  653.     // find azimuth in the range -2π..2π
  654.     azimuth = fmodf(azimuth, 2.0*pi);
  655.     
  656.     // find azimuth in the range -π..π
  657.     if (azimuth < -pi)
  658.     {
  659.         azimuth += 2.0*pi;
  660.     }
  661.     else if (azimuth > pi)
  662.     {
  663.         azimuth -= 2.0*pi;
  664.     }
  665.     
  666.     // find azimuth in the range -π/2..π/2
  667.     if (azimuth < -0.5*pi)
  668.     {
  669.         azimuth = -pi-azimuth;
  670.         elevation -= pi;
  671.     }
  672.     else if (azimuth > 0.5*pi)
  673.     {
  674.         azimuth = pi-azimuth;
  675.         elevation -= pi;
  676.     }
  677.     
  678.     // find elevation in the range -2π..2π
  679.     elevation = fmodf(elevation, 2.0*pi);
  680.     
  681.     // find elevation in the range -π..π
  682.     if (elevation < -pi)
  683.     {
  684.         elevation += 2.0*pi;
  685.     }
  686.     else if (elevation > pi)
  687.     {
  688.         elevation -= 2.0*pi;
  689.     }
  690.     
  691.     snd3DInfo.currentLocation.elevation = elevation;
  692.     snd3DInfo.currentLocation.azimuth = azimuth;
  693.     
  694.     snd3DInfo.currentLocation.distance = TestLoLevel_DoInterpolate(
  695.             gTestLoLevelInterpolant,
  696.             gTestLoLevelData.distance1,
  697.             gTestLoLevelData.distance2,
  698.             gTestLoLevelData.distanceRange);
  699.     
  700.     snd3DInfo.currentLocation.projectionAngle = TestLoLevel_DoInterpolate(
  701.             gTestLoLevelInterpolant,
  702.             gTestLoLevelData.projectionAngle1,
  703.             gTestLoLevelData.projectionAngle2,
  704.             gTestLoLevelData.projectionAngleDegRange);
  705.     
  706.     snd3DInfo.currentLocation.sourceVelocity = TestLoLevel_DoInterpolate(
  707.             gTestLoLevelInterpolant,
  708.             gTestLoLevelData.sourceVelocity1,
  709.             gTestLoLevelData.sourceVelocity2,
  710.             gTestLoLevelData.sourceVelocityRange);
  711.     
  712.     snd3DInfo.currentLocation.listenerVelocity = TestLoLevel_DoInterpolate(
  713.             gTestLoLevelInterpolant,
  714.             gTestLoLevelData.listenerVelocity1,
  715.             gTestLoLevelData.listenerVelocity2,
  716.             gTestLoLevelData.listenerVelocityRange);
  717.     
  718.     snd3DInfo.reserved0 = 0;
  719.     snd3DInfo.reserved1 = 0;
  720.     snd3DInfo.reserved2 = 0;
  721.     snd3DInfo.reserved3 = 0;
  722.     
  723.     snd3DInfo.virtualSourceCount = 0;
  724.     
  725.     // Make the filter changes
  726.     Sound_Set3DInfo(&snd3DInfo);
  727.     
  728.     // Update the progress bar
  729.     SetPort(gTestLoLevelDialog);
  730.     TestLoLevel_ProgressUserItem(gTestLoLevelDialog, kLoLevelItem_Progress);
  731. }
  732.  
  733.  
  734. /* =============================================================================
  735.  *        TestLoLevel_DoInterpolate (internal)
  736.  *
  737.  *    Linear interpolation.  When inWhere is zero, inVal0 is returned.  When it
  738.  *    is one, inVal1 is returned.  In between is linear.  If inIsRange is false
  739.  *    then we ignore inVal1 and always return inVal0.
  740.  * ========================================================================== */
  741. float TestLoLevel_DoInterpolate(
  742.     float                inWhere,
  743.     float                inVal0,
  744.     float                inVal1,
  745.     Boolean                inIsRange)
  746. {
  747.     float                result;
  748.     
  749.     if (inIsRange)
  750.     {
  751.         result = inWhere*(inVal1-inVal0) + inVal0;
  752.     }
  753.     else
  754.     {
  755.         result = inVal0;
  756.     }
  757.     
  758.     return result;
  759. }
  760.  
  761.  
  762. /* =============================================================================
  763.  *        TestLoLevel_DeriveData (internal)
  764.  *
  765.  *    Compute the derived fields in gTestLoLevelData.
  766.  * ========================================================================== */
  767. void TestLoLevel_DeriveData(
  768.     void)
  769. {
  770.     gTestLoLevelData.coneAngleCos1            = cosf(0.5*(pi/180.0)*gTestLoLevelData.coneAngleDeg1);
  771.     gTestLoLevelData.coneAngleCos2            = cosf(0.5*(pi/180.0)*gTestLoLevelData.coneAngleDeg2);
  772.     
  773.     gTestLoLevelData.elevation1                = (pi/180.0)*gTestLoLevelData.elevationDeg1;
  774.     gTestLoLevelData.elevation2                = (pi/180.0)*gTestLoLevelData.elevationDeg2;
  775.     
  776.     gTestLoLevelData.azimuth1                = (pi/180.0)*gTestLoLevelData.azimuthDeg1;
  777.     gTestLoLevelData.azimuth2                = (pi/180.0)*gTestLoLevelData.azimuthDeg2;
  778.     
  779.     gTestLoLevelData.projectionAngle1        = cosf((pi/180.0)*gTestLoLevelData.projectionAngleDeg1);
  780.     gTestLoLevelData.projectionAngle2        = cosf((pi/180.0)*gTestLoLevelData.projectionAngleDeg2);
  781. }
  782.  
  783.  
  784. /* =============================================================================
  785.  *        TestLoLevel_SetDialogFields (internal)
  786.  *
  787.  *    Changes the dialog's fields to reflect gTestLoLevelData.
  788.  * ========================================================================== */
  789. void TestLoLevel_SetDialogFields(
  790.     void)
  791. {
  792.     short                itemType;
  793.     Handle                itemHandle;
  794.     Rect                itemBounds;
  795.     short                value;
  796.     
  797.     Utils_SetFloatField(
  798.             gTestLoLevelDialog,
  799.             kLoLevelItem_Duration,
  800.             gTestLoLevelData.duration,
  801.             true);
  802.     
  803.     Utils_SetUInt32Field(
  804.             gTestLoLevelDialog,
  805.             kLoLevelItem_CPULoad1,
  806.             gTestLoLevelData.cpuLoad1,
  807.             true);
  808.     
  809.     Utils_SetUInt32Field(
  810.             gTestLoLevelDialog,
  811.             kLoLevelItem_CPULoad2,
  812.             gTestLoLevelData.cpuLoad2,
  813.             gTestLoLevelData.cpuLoadRange);
  814.     
  815.     GetDialogItem(gTestLoLevelDialog, kLoLevelItem_Medium, &itemType, &itemHandle, &itemBounds);
  816.     SetControlValue((ControlHandle) itemHandle,
  817.             (gTestLoLevelData.medium == kSSpMedium_Water)
  818.                     ? kMediumItem_Water
  819.                     : kMediumItem_Air);
  820.     
  821.     Utils_SetFloatField(
  822.             gTestLoLevelDialog,
  823.             kLoLevelItem_Humidity1,
  824.             gTestLoLevelData.humidity1,
  825.             true);
  826.     
  827.     Utils_SetFloatField(
  828.             gTestLoLevelDialog,
  829.             kLoLevelItem_Humidity2,
  830.             gTestLoLevelData.humidity2,
  831.             gTestLoLevelData.humidityRange);
  832.     
  833.     Utils_SetFloatField(
  834.             gTestLoLevelDialog,
  835.             kLoLevelItem_RoomSize1,
  836.             gTestLoLevelData.roomSize1,
  837.             true);
  838.     
  839.     Utils_SetFloatField(
  840.             gTestLoLevelDialog,
  841.             kLoLevelItem_RoomSize2,
  842.             gTestLoLevelData.roomSize2,
  843.             gTestLoLevelData.roomSizeRange);
  844.     
  845.     Utils_SetFloatField(
  846.             gTestLoLevelDialog,
  847.             kLoLevelItem_RoomReflectivity1,
  848.             gTestLoLevelData.roomReflectivity1,
  849.             true);
  850.     
  851.     Utils_SetFloatField(
  852.             gTestLoLevelDialog,
  853.             kLoLevelItem_RoomReflectivity2,
  854.             gTestLoLevelData.roomReflectivity2,
  855.             gTestLoLevelData.roomReflectivityRange);
  856.     
  857.     Utils_SetFloatField(
  858.             gTestLoLevelDialog,
  859.             kLoLevelItem_ReverbAttenuation1,
  860.             gTestLoLevelData.reverbAttenuation1,
  861.             true);
  862.     
  863.     Utils_SetFloatField(
  864.             gTestLoLevelDialog,
  865.             kLoLevelItem_ReverbAttenuation2,
  866.             gTestLoLevelData.reverbAttenuation2,
  867.             gTestLoLevelData.reverbAttenuationRange);
  868.     
  869.     value = kSourceModeItem_Unfiltered;
  870.     switch (gTestLoLevelData.sourceMode)
  871.     {
  872.         case kSSpSourceMode_Localized:
  873.             value = kSourceModeItem_Localized;
  874.         break;
  875.         
  876.         case kSSpSourceMode_Ambient:
  877.             value = kSourceModeItem_Ambient;
  878.         break;
  879.         
  880.         case kSSpSourceMode_Binaural:
  881.             value = kSourceModeItem_Binaural;
  882.         break;
  883.     }
  884.     
  885.     GetDialogItem(gTestLoLevelDialog, kLoLevelItem_SourceMode, &itemType, &itemHandle, &itemBounds);
  886.     SetControlValue((ControlHandle) itemHandle, value);
  887.     
  888.     Utils_SetFloatField(
  889.             gTestLoLevelDialog,
  890.             kLoLevelItem_ReferenceDistance1,
  891.             gTestLoLevelData.referenceDistance1,
  892.             true);
  893.     
  894.     Utils_SetFloatField(
  895.             gTestLoLevelDialog,
  896.             kLoLevelItem_ReferenceDistance2,
  897.             gTestLoLevelData.referenceDistance2,
  898.             gTestLoLevelData.referenceDistanceRange);
  899.     
  900.     Utils_SetFloatField(
  901.             gTestLoLevelDialog,
  902.             kLoLevelItem_ConeAngleDeg1,
  903.             gTestLoLevelData.coneAngleDeg1,
  904.             true);
  905.     
  906.     Utils_SetFloatField(
  907.             gTestLoLevelDialog,
  908.             kLoLevelItem_ConeAngleDeg2,
  909.             gTestLoLevelData.coneAngleDeg2,
  910.             gTestLoLevelData.coneAngleDegRange);
  911.     
  912.     Utils_SetFloatField(
  913.             gTestLoLevelDialog,
  914.             kLoLevelItem_ConeAttenuation1,
  915.             gTestLoLevelData.coneAttenuation1,
  916.             true);
  917.     
  918.     Utils_SetFloatField(
  919.             gTestLoLevelDialog,
  920.             kLoLevelItem_ConeAttenuation2,
  921.             gTestLoLevelData.coneAttenuation2,
  922.             gTestLoLevelData.coneAttenuationRange);
  923.     
  924.     Utils_SetFloatField(
  925.             gTestLoLevelDialog,
  926.             kLoLevelItem_ElevationDeg1,
  927.             gTestLoLevelData.elevationDeg1,
  928.             true);
  929.     
  930.     Utils_SetFloatField(
  931.             gTestLoLevelDialog,
  932.             kLoLevelItem_ElevationDeg2,
  933.             gTestLoLevelData.elevationDeg2,
  934.             gTestLoLevelData.elevationDegRange);
  935.     
  936.     Utils_SetFloatField(
  937.             gTestLoLevelDialog,
  938.             kLoLevelItem_AzimuthDeg1,
  939.             gTestLoLevelData.azimuthDeg1,
  940.             true);
  941.     
  942.     Utils_SetFloatField(
  943.             gTestLoLevelDialog,
  944.             kLoLevelItem_AzimuthDeg2,
  945.             gTestLoLevelData.azimuthDeg2,
  946.             gTestLoLevelData.azimuthDegRange);
  947.     
  948.     Utils_SetFloatField(
  949.             gTestLoLevelDialog,
  950.             kLoLevelItem_Distance1,
  951.             gTestLoLevelData.distance1,
  952.             true);
  953.     
  954.     Utils_SetFloatField(
  955.             gTestLoLevelDialog,
  956.             kLoLevelItem_Distance2,
  957.             gTestLoLevelData.distance2,
  958.             gTestLoLevelData.distanceRange);
  959.     
  960.     Utils_SetFloatField(
  961.             gTestLoLevelDialog,
  962.             kLoLevelItem_ProjectionAngleDeg1,
  963.             gTestLoLevelData.projectionAngleDeg1,
  964.             true);
  965.     
  966.     Utils_SetFloatField(
  967.             gTestLoLevelDialog,
  968.             kLoLevelItem_ProjectionAngleDeg2,
  969.             gTestLoLevelData.projectionAngleDeg2,
  970.             gTestLoLevelData.projectionAngleDegRange);
  971.     
  972.     Utils_SetFloatField(
  973.             gTestLoLevelDialog,
  974.             kLoLevelItem_SourceVelocity1,
  975.             gTestLoLevelData.sourceVelocity1,
  976.             true);
  977.     
  978.     Utils_SetFloatField(
  979.             gTestLoLevelDialog,
  980.             kLoLevelItem_SourceVelocity2,
  981.             gTestLoLevelData.sourceVelocity2,
  982.             gTestLoLevelData.sourceVelocityRange);
  983.     
  984.     Utils_SetFloatField(
  985.             gTestLoLevelDialog,
  986.             kLoLevelItem_ListenerVelocity1,
  987.             gTestLoLevelData.listenerVelocity1,
  988.             true);
  989.     
  990.     Utils_SetFloatField(
  991.             gTestLoLevelDialog,
  992.             kLoLevelItem_ListenerVelocity2,
  993.             gTestLoLevelData.listenerVelocity2,
  994.             gTestLoLevelData.listenerVelocityRange);
  995. }
  996.  
  997.  
  998. /* =============================================================================
  999.  *        TestLoLevel_GetDialogFields (internal)
  1000.  *
  1001.  *    Grabs the contents of the dialog fields and puts them into gTestLoLevelData.
  1002.  * ========================================================================== */
  1003. void TestLoLevel_GetDialogFields(
  1004.     void)
  1005. {
  1006.     const float            small = 0.000001;
  1007.     const float            big = 10000000.0;
  1008.     short                itemType;
  1009.     Handle                itemHandle;
  1010.     Rect                itemBounds;
  1011.     TTestLoLevelData    data;
  1012.     short                badItem;
  1013.     
  1014.     if (!Utils_GetFloatField(
  1015.             gTestLoLevelDialog,
  1016.             kLoLevelItem_Duration,
  1017.             &data.duration,
  1018.             NULL,
  1019.             small,
  1020.             big))
  1021.     {
  1022.         badItem = kLoLevelItem_Duration;
  1023.         goto bail;
  1024.     }
  1025.     
  1026.     if (!Utils_GetUInt32Field(
  1027.             gTestLoLevelDialog,
  1028.             kLoLevelItem_CPULoad1,
  1029.             &data.cpuLoad1,
  1030.             NULL,
  1031.             0,
  1032.             gTestLoLevelCPULoadLimit))
  1033.     {
  1034.         badItem = kLoLevelItem_CPULoad1;
  1035.         goto bail;
  1036.     }
  1037.     
  1038.     if (!Utils_GetUInt32Field(
  1039.             gTestLoLevelDialog,
  1040.             kLoLevelItem_CPULoad2,
  1041.             &data.cpuLoad2,
  1042.             &data.cpuLoadRange,
  1043.             0,
  1044.             gTestLoLevelCPULoadLimit))
  1045.     {
  1046.         badItem = kLoLevelItem_CPULoad2;
  1047.         goto bail;
  1048.     }
  1049.     
  1050.     GetDialogItem(gTestLoLevelDialog, kLoLevelItem_Medium, &itemType, &itemHandle, &itemBounds);
  1051.     switch (GetControlValue((ControlHandle) itemHandle))
  1052.     {
  1053.         case kMediumItem_Air:
  1054.             data.medium = kSSpMedium_Air;
  1055.         break;
  1056.         
  1057.         case kMediumItem_Water:
  1058.             data.medium = kSSpMedium_Water;
  1059.         break;
  1060.         
  1061.         default:
  1062.             assert(0);
  1063.     }
  1064.     
  1065.     if (!Utils_GetFloatField(
  1066.             gTestLoLevelDialog,
  1067.             kLoLevelItem_Humidity1,
  1068.             &data.humidity1,
  1069.             NULL,
  1070.             0.0,
  1071.             100.0))
  1072.     {
  1073.         badItem = kLoLevelItem_Humidity1;
  1074.         goto bail;
  1075.     }
  1076.     
  1077.     if (!Utils_GetFloatField(
  1078.             gTestLoLevelDialog,
  1079.             kLoLevelItem_Humidity2,
  1080.             &data.humidity2,
  1081.             &data.humidityRange,
  1082.             0.0,
  1083.             100.0))
  1084.     {
  1085.         badItem = kLoLevelItem_Humidity2;
  1086.         goto bail;
  1087.     }
  1088.     
  1089.     if (!Utils_GetFloatField(
  1090.             gTestLoLevelDialog,
  1091.             kLoLevelItem_RoomSize1,
  1092.             &data.roomSize1,
  1093.             NULL,
  1094.             0.0,
  1095.             big))
  1096.     {
  1097.         badItem = kLoLevelItem_RoomSize1;
  1098.         goto bail;
  1099.     }
  1100.     
  1101.     if (!Utils_GetFloatField(
  1102.             gTestLoLevelDialog,
  1103.             kLoLevelItem_RoomSize2,
  1104.             &data.roomSize2,
  1105.             &data.roomSizeRange,
  1106.             0.0,
  1107.             big))
  1108.     {
  1109.         badItem = kLoLevelItem_RoomSize2;
  1110.         goto bail;
  1111.     }
  1112.     
  1113.     if (!Utils_GetFloatField(
  1114.             gTestLoLevelDialog,
  1115.             kLoLevelItem_RoomReflectivity1,
  1116.             &data.roomReflectivity1,
  1117.             NULL,
  1118.             -big,
  1119.             -small))
  1120.     {
  1121.         badItem = kLoLevelItem_RoomReflectivity1;
  1122.         goto bail;
  1123.     }
  1124.     
  1125.     if (!Utils_GetFloatField(
  1126.             gTestLoLevelDialog,
  1127.             kLoLevelItem_RoomReflectivity2,
  1128.             &data.roomReflectivity2,
  1129.             &data.roomReflectivityRange,
  1130.             -big,
  1131.             -small))
  1132.     {
  1133.         badItem = kLoLevelItem_RoomReflectivity2;
  1134.         goto bail;
  1135.     }
  1136.     
  1137.     if (!Utils_GetFloatField(
  1138.             gTestLoLevelDialog,
  1139.             kLoLevelItem_ReverbAttenuation1,
  1140.             &data.reverbAttenuation1,
  1141.             NULL,
  1142.             -big,
  1143.             big))
  1144.     {
  1145.         badItem = kLoLevelItem_ReverbAttenuation1;
  1146.         goto bail;
  1147.     }
  1148.     
  1149.     if (!Utils_GetFloatField(
  1150.             gTestLoLevelDialog,
  1151.             kLoLevelItem_ReverbAttenuation2,
  1152.             &data.reverbAttenuation2,
  1153.             &data.reverbAttenuationRange,
  1154.             -big,
  1155.             big))
  1156.     {
  1157.         badItem = kLoLevelItem_ReverbAttenuation2;
  1158.         goto bail;
  1159.     }
  1160.     
  1161.     GetDialogItem(gTestLoLevelDialog, kLoLevelItem_SourceMode, &itemType, &itemHandle, &itemBounds);
  1162.     switch (GetControlValue((ControlHandle) itemHandle))
  1163.     {
  1164.         case kSourceModeItem_Unfiltered:
  1165.             data.sourceMode = kSSpSourceMode_Unfiltered;
  1166.         break;
  1167.         
  1168.         case kSourceModeItem_Localized:
  1169.             data.sourceMode = kSSpSourceMode_Localized;
  1170.         break;
  1171.         
  1172.         case kSourceModeItem_Ambient:
  1173.             data.sourceMode = kSSpSourceMode_Ambient;
  1174.         break;
  1175.         
  1176.         case kSourceModeItem_Binaural:
  1177.             data.sourceMode = kSSpSourceMode_Binaural;
  1178.         break;
  1179.         
  1180.         default:
  1181.             assert(0);
  1182.     }
  1183.     
  1184.     if (!Utils_GetFloatField(
  1185.             gTestLoLevelDialog,
  1186.             kLoLevelItem_ReferenceDistance1,
  1187.             &data.referenceDistance1,
  1188.             NULL,
  1189.             small,
  1190.             big))
  1191.     {
  1192.         badItem = kLoLevelItem_ReferenceDistance1;
  1193.         goto bail;
  1194.     }
  1195.     
  1196.     if (!Utils_GetFloatField(
  1197.             gTestLoLevelDialog,
  1198.             kLoLevelItem_ReferenceDistance2,
  1199.             &data.referenceDistance2,
  1200.             &data.referenceDistanceRange,
  1201.             small,
  1202.             big))
  1203.     {
  1204.         badItem = kLoLevelItem_ReferenceDistance2;
  1205.         goto bail;
  1206.     }
  1207.     
  1208.     if (!Utils_GetFloatField(
  1209.             gTestLoLevelDialog,
  1210.             kLoLevelItem_ConeAngleDeg1,
  1211.             &data.coneAngleDeg1,
  1212.             NULL,
  1213.             0.0,
  1214.             360.0))
  1215.     {
  1216.         badItem = kLoLevelItem_ConeAngleDeg1;
  1217.         goto bail;
  1218.     }
  1219.     
  1220.     if (!Utils_GetFloatField(
  1221.             gTestLoLevelDialog,
  1222.             kLoLevelItem_ConeAngleDeg2,
  1223.             &data.coneAngleDeg2,
  1224.             &data.coneAngleDegRange,
  1225.             0.0,
  1226.             360.0))
  1227.     {
  1228.         badItem = kLoLevelItem_ConeAngleDeg2;
  1229.         goto bail;
  1230.     }
  1231.     
  1232.     if (!Utils_GetFloatField(
  1233.             gTestLoLevelDialog,
  1234.             kLoLevelItem_ConeAttenuation1,
  1235.             &data.coneAttenuation1,
  1236.             NULL,
  1237.             -big,
  1238.             big))
  1239.     {
  1240.         badItem = kLoLevelItem_ConeAttenuation1;
  1241.         goto bail;
  1242.     }
  1243.     
  1244.     if (!Utils_GetFloatField(
  1245.             gTestLoLevelDialog,
  1246.             kLoLevelItem_ConeAttenuation2,
  1247.             &data.coneAttenuation2,
  1248.             &data.coneAttenuationRange,
  1249.             -big,
  1250.             big))
  1251.     {
  1252.         badItem = kLoLevelItem_ConeAttenuation2;
  1253.         goto bail;
  1254.     }
  1255.     
  1256.     if (!Utils_GetFloatField(
  1257.             gTestLoLevelDialog,
  1258.             kLoLevelItem_ElevationDeg1,
  1259.             &data.elevationDeg1,
  1260.             NULL,
  1261.             -big,
  1262.             big))
  1263.     {
  1264.         badItem = kLoLevelItem_ElevationDeg1;
  1265.         goto bail;
  1266.     }
  1267.     
  1268.     if (!Utils_GetFloatField(
  1269.             gTestLoLevelDialog,
  1270.             kLoLevelItem_ElevationDeg2,
  1271.             &data.elevationDeg2,
  1272.             &data.elevationDegRange,
  1273.             -big,
  1274.             big))
  1275.     {
  1276.         badItem = kLoLevelItem_ElevationDeg2;
  1277.         goto bail;
  1278.     }
  1279.     
  1280.     
  1281.     if (!Utils_GetFloatField(
  1282.             gTestLoLevelDialog,
  1283.             kLoLevelItem_AzimuthDeg1,
  1284.             &data.azimuthDeg1,
  1285.             NULL,
  1286.             -big,
  1287.             big))
  1288.     {
  1289.         badItem = kLoLevelItem_AzimuthDeg1;
  1290.         goto bail;
  1291.     }
  1292.     
  1293.     if (!Utils_GetFloatField(
  1294.             gTestLoLevelDialog,
  1295.             kLoLevelItem_AzimuthDeg2,
  1296.             &data.azimuthDeg2,
  1297.             &data.azimuthDegRange,
  1298.             -big,
  1299.             big))
  1300.     {
  1301.         badItem = kLoLevelItem_AzimuthDeg2;
  1302.         goto bail;
  1303.     }
  1304.     
  1305.     if (!Utils_GetFloatField(
  1306.             gTestLoLevelDialog,
  1307.             kLoLevelItem_Distance1,
  1308.             &data.distance1,
  1309.             NULL,
  1310.             small,
  1311.             big))
  1312.     {
  1313.         badItem = kLoLevelItem_Distance1;
  1314.         goto bail;
  1315.     }
  1316.     
  1317.     if (!Utils_GetFloatField(
  1318.             gTestLoLevelDialog,
  1319.             kLoLevelItem_Distance2,
  1320.             &data.distance2,
  1321.             &data.distanceRange,
  1322.             small,
  1323.             big))
  1324.     {
  1325.         badItem = kLoLevelItem_Distance2;
  1326.         goto bail;
  1327.     }
  1328.     
  1329.     if (!Utils_GetFloatField(
  1330.             gTestLoLevelDialog,
  1331.             kLoLevelItem_ProjectionAngleDeg1,
  1332.             &data.projectionAngleDeg1,
  1333.             NULL,
  1334.             0.0,
  1335.             180.0))
  1336.     {
  1337.         badItem = kLoLevelItem_ProjectionAngleDeg1;
  1338.         goto bail;
  1339.     }
  1340.     
  1341.     if (!Utils_GetFloatField(
  1342.             gTestLoLevelDialog,
  1343.             kLoLevelItem_ProjectionAngleDeg2,
  1344.             &data.projectionAngleDeg2,
  1345.             &data.projectionAngleDegRange,
  1346.             0.0,
  1347.             180.0))
  1348.     {
  1349.         badItem = kLoLevelItem_ProjectionAngleDeg2;
  1350.         goto bail;
  1351.     }
  1352.     
  1353.     if (!Utils_GetFloatField(
  1354.             gTestLoLevelDialog,
  1355.             kLoLevelItem_SourceVelocity1,
  1356.             &data.sourceVelocity1,
  1357.             NULL,
  1358.             -big,
  1359.             big))
  1360.     {
  1361.         badItem = kLoLevelItem_SourceVelocity1;
  1362.         goto bail;
  1363.     }
  1364.     
  1365.     if (!Utils_GetFloatField(
  1366.             gTestLoLevelDialog,
  1367.             kLoLevelItem_SourceVelocity2,
  1368.             &data.sourceVelocity2,
  1369.             &data.sourceVelocityRange,
  1370.             -big,
  1371.             big))
  1372.     {
  1373.         badItem = kLoLevelItem_SourceVelocity2;
  1374.         goto bail;
  1375.     }
  1376.     
  1377.     if (!Utils_GetFloatField(
  1378.             gTestLoLevelDialog,
  1379.             kLoLevelItem_ListenerVelocity1,
  1380.             &data.listenerVelocity1,
  1381.             NULL,
  1382.             -big,
  1383.             big))
  1384.     {
  1385.         badItem = kLoLevelItem_ListenerVelocity1;
  1386.         goto bail;
  1387.     }
  1388.     
  1389.     if (!Utils_GetFloatField(
  1390.             gTestLoLevelDialog,
  1391.             kLoLevelItem_ListenerVelocity2,
  1392.             &data.listenerVelocity2,
  1393.             &data.listenerVelocityRange,
  1394.             -big,
  1395.             big))
  1396.     {
  1397.         badItem = kLoLevelItem_ListenerVelocity2;
  1398.         goto bail;
  1399.     }
  1400.     
  1401.     // All fields are good -- finish up
  1402.     gTestLoLevelData = data;
  1403.     TestLoLevel_DeriveData();
  1404.     
  1405.     TestLoLevel_SetDialogFields();
  1406.     
  1407.     return;
  1408.     
  1409.     // Error exit
  1410. bail:
  1411.     SelectDialogItemText(gTestLoLevelDialog, badItem, 0, 32767);
  1412.     StopAlert(kAlrtID_BadField, NULL);
  1413. }
  1414.  
  1415.  
  1416. /* =============================================================================
  1417.  *        TestLoLevel_Preset (external)
  1418.  *
  1419.  *    Updates the fields to the chosen preset value.
  1420.  * ========================================================================== */
  1421. void TestLoLevel_Preset(
  1422.     UInt32            index)
  1423. {
  1424.     TTestLoLevelData preset[] = {
  1425.         { /* nothing for index zero */ 0 },
  1426.         { /* Side-to-Side */
  1427.                 /* duration                */   4.0,
  1428.                 /* cpuLoad                */     0,     0, false,
  1429.                 /* medium                */ kSSpMedium_Air,
  1430.                 /* humidity                */   0.0,   0.0, false,
  1431.                 /* roomSize                */   0.0,   0.0, false,
  1432.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1433.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1434.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1435.                 /* referenceDistance    */   1.0,   0.0, false,
  1436.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1437.                 /* coneAttenuation        */   0.0,   0.0, false,
  1438.                 /* elevationDeg            */   0.0,   0.0, false,
  1439.                 /* azimuthDeg            */ -90.0,  90.0, true,
  1440.                 /* distance                */   1.0,   0.0, false,
  1441.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1442.                 /* sourceVelocity        */   0.0,   0.0, false,
  1443.                 /* listenerVelocity        */   0.0,   0.0, false
  1444.         },
  1445.         { /* dividing line */ 0 },
  1446.         { /* Ahead */
  1447.                 /* duration                */   4.0,
  1448.                 /* cpuLoad                */     0,     0, false,
  1449.                 /* medium                */ kSSpMedium_Air,
  1450.                 /* humidity                */   0.0,   0.0, false,
  1451.                 /* roomSize                */   0.0,   0.0, false,
  1452.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1453.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1454.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1455.                 /* referenceDistance    */   1.0,   0.0, false,
  1456.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1457.                 /* coneAttenuation        */   0.0,   0.0, false,
  1458.                 /* elevationDeg            */   0.0,   0.0, false,
  1459.                 /* azimuthDeg            */   0.0,   0.0, false,
  1460.                 /* distance                */   1.0,  10.0, true,
  1461.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1462.                 /* sourceVelocity        */   0.0,   0.0, false,
  1463.                 /* listenerVelocity        */   0.0,   0.0, false
  1464.         },
  1465.         { /* Ahead-Right */
  1466.                 /* duration                */   4.0,
  1467.                 /* cpuLoad                */     0,     0, false,
  1468.                 /* medium                */ kSSpMedium_Air,
  1469.                 /* humidity                */   0.0,   0.0, false,
  1470.                 /* roomSize                */   0.0,   0.0, false,
  1471.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1472.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1473.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1474.                 /* referenceDistance    */   1.0,   0.0, false,
  1475.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1476.                 /* coneAttenuation        */   0.0,   0.0, false,
  1477.                 /* elevationDeg            */   0.0,   0.0, false,
  1478.                 /* azimuthDeg            */  45.0,   0.0, false,
  1479.                 /* distance                */   1.0,  10.0, true,
  1480.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1481.                 /* sourceVelocity        */   0.0,   0.0, false,
  1482.                 /* listenerVelocity        */   0.0,   0.0, false
  1483.         },
  1484.         { /* Right */
  1485.                 /* duration                */   4.0,
  1486.                 /* cpuLoad                */     0,     0, false,
  1487.                 /* medium                */ kSSpMedium_Air,
  1488.                 /* humidity                */   0.0,   0.0, false,
  1489.                 /* roomSize                */   0.0,   0.0, false,
  1490.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1491.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1492.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1493.                 /* referenceDistance    */   1.0,   0.0, false,
  1494.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1495.                 /* coneAttenuation        */   0.0,   0.0, false,
  1496.                 /* elevationDeg            */   0.0,   0.0, false,
  1497.                 /* azimuthDeg            */  90.0,   0.0, false,
  1498.                 /* distance                */   1.0,  10.0, true,
  1499.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1500.                 /* sourceVelocity        */   0.0,   0.0, false,
  1501.                 /* listenerVelocity        */   0.0,   0.0, false
  1502.         },
  1503.         { /* Behind-Right */
  1504.                 /* duration                */   4.0,
  1505.                 /* cpuLoad                */     0,     0, false,
  1506.                 /* medium                */ kSSpMedium_Air,
  1507.                 /* humidity                */   0.0,   0.0, false,
  1508.                 /* roomSize                */   0.0,   0.0, false,
  1509.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1510.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1511.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1512.                 /* referenceDistance    */   1.0,   0.0, false,
  1513.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1514.                 /* coneAttenuation        */   0.0,   0.0, false,
  1515.                 /* elevationDeg            */ 180.0,   0.0, false,
  1516.                 /* azimuthDeg            */  45.0,   0.0, false,
  1517.                 /* distance                */   1.0,  10.0, true,
  1518.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1519.                 /* sourceVelocity        */   0.0,   0.0, false,
  1520.                 /* listenerVelocity        */   0.0,   0.0, false
  1521.         },
  1522.         { /* Behind */
  1523.                 /* duration                */   4.0,
  1524.                 /* cpuLoad                */     0,     0, false,
  1525.                 /* medium                */ kSSpMedium_Air,
  1526.                 /* humidity                */   0.0,   0.0, false,
  1527.                 /* roomSize                */   0.0,   0.0, false,
  1528.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1529.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1530.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1531.                 /* referenceDistance    */   1.0,   0.0, false,
  1532.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1533.                 /* coneAttenuation        */   0.0,   0.0, false,
  1534.                 /* elevationDeg            */ 180.0,   0.0, false,
  1535.                 /* azimuthDeg            */   0.0,   0.0, false,
  1536.                 /* distance                */   1.0,  10.0, true,
  1537.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1538.                 /* sourceVelocity        */   0.0,   0.0, false,
  1539.                 /* listenerVelocity        */   0.0,   0.0, false
  1540.         },
  1541.         { /* Behind-Left */
  1542.                 /* duration                */   4.0,
  1543.                 /* cpuLoad                */     0,     0, false,
  1544.                 /* medium                */ kSSpMedium_Air,
  1545.                 /* humidity                */   0.0,   0.0, false,
  1546.                 /* roomSize                */   0.0,   0.0, false,
  1547.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1548.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1549.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1550.                 /* referenceDistance    */   1.0,   0.0, false,
  1551.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1552.                 /* coneAttenuation        */   0.0,   0.0, false,
  1553.                 /* elevationDeg            */ 180.0,   0.0, false,
  1554.                 /* azimuthDeg            */ -45.0,   0.0, false,
  1555.                 /* distance                */   1.0,  10.0, true,
  1556.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1557.                 /* sourceVelocity        */   0.0,   0.0, false,
  1558.                 /* listenerVelocity        */   0.0,   0.0, false
  1559.         },
  1560.         { /* Left */
  1561.                 /* duration                */   4.0,
  1562.                 /* cpuLoad                */     0,     0, false,
  1563.                 /* medium                */ kSSpMedium_Air,
  1564.                 /* humidity                */   0.0,   0.0, false,
  1565.                 /* roomSize                */   0.0,   0.0, false,
  1566.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1567.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1568.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1569.                 /* referenceDistance    */   1.0,   0.0, false,
  1570.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1571.                 /* coneAttenuation        */   0.0,   0.0, false,
  1572.                 /* elevationDeg            */   0.0,   0.0, false,
  1573.                 /* azimuthDeg            */ -90.0,   0.0, false,
  1574.                 /* distance                */   1.0,  10.0, true,
  1575.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1576.                 /* sourceVelocity        */   0.0,   0.0, false,
  1577.                 /* listenerVelocity        */   0.0,   0.0, false
  1578.         },
  1579.         { /* Ahead-Left */
  1580.                 /* duration                */   4.0,
  1581.                 /* cpuLoad                */     0,     0, false,
  1582.                 /* medium                */ kSSpMedium_Air,
  1583.                 /* humidity                */   0.0,   0.0, false,
  1584.                 /* roomSize                */   0.0,   0.0, false,
  1585.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1586.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1587.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1588.                 /* referenceDistance    */   1.0,   0.0, false,
  1589.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1590.                 /* coneAttenuation        */   0.0,   0.0, false,
  1591.                 /* elevationDeg            */   0.0,   0.0, false,
  1592.                 /* azimuthDeg            */ -45.0,   0.0, false,
  1593.                 /* distance                */   1.0,  10.0, true,
  1594.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1595.                 /* sourceVelocity        */   0.0,   0.0, false,
  1596.                 /* listenerVelocity        */   0.0,   0.0, false
  1597.         },
  1598.         { /* dividing line */ 0 },
  1599.         { /* Around (1 meter) */
  1600.                 /* duration                */    4.0,
  1601.                 /* cpuLoad                */      0,     0, false,
  1602.                 /* medium                */  kSSpMedium_Air,
  1603.                 /* humidity                */    0.0,   0.0, false,
  1604.                 /* roomSize                */    0.0,   0.0, false,
  1605.                 /* roomReflectivity        */  -10.0,   0.0, false,
  1606.                 /* reverbAttenuation    */  -15.0,   0.0, false,
  1607.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1608.                 /* referenceDistance    */    1.0,   0.0, false,
  1609.                 /* coneAngleDeg            */   90.0,   0.0, false,
  1610.                 /* coneAttenuation        */    0.0,   0.0, false,
  1611.                 /* elevationDeg            */    0.0,   0.0, false,
  1612.                 /* azimuthDeg            */ -180.0, 180.0, true,
  1613.                 /* distance                */    1.0,   0.0, false,
  1614.                 /* projectionAngleDeg    */    0.0,   0.0, false,
  1615.                 /* sourceVelocity        */    0.0,   0.0, false,
  1616.                 /* listenerVelocity        */    0.0,   0.0, false
  1617.         },
  1618.         { /* Around (10 meters) */
  1619.                 /* duration                */    4.0,
  1620.                 /* cpuLoad                */      0,     0, false,
  1621.                 /* medium                */  kSSpMedium_Air,
  1622.                 /* humidity                */    0.0,   0.0, false,
  1623.                 /* roomSize                */    0.0,   0.0, false,
  1624.                 /* roomReflectivity        */  -10.0,   0.0, false,
  1625.                 /* reverbAttenuation    */  -15.0,   0.0, false,
  1626.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1627.                 /* referenceDistance    */    1.0,   0.0, false,
  1628.                 /* coneAngleDeg            */   90.0,   0.0, false,
  1629.                 /* coneAttenuation        */    0.0,   0.0, false,
  1630.                 /* elevationDeg            */    0.0,   0.0, false,
  1631.                 /* azimuthDeg            */ -180.0, 180.0, true,
  1632.                 /* distance                */   10.0,   0.0, false,
  1633.                 /* projectionAngleDeg    */    0.0,   0.0, false,
  1634.                 /* sourceVelocity        */    0.0,   0.0, false,
  1635.                 /* listenerVelocity        */    0.0,   0.0, false
  1636.         },
  1637.         { /* dividing line */ 0 },
  1638.         { /* Reverb — Living Room */
  1639.                 /* duration                */  10.0,
  1640.                 /* cpuLoad                */     0,     0, false,
  1641.                 /* medium                */ kSSpMedium_Air,
  1642.                 /* humidity                */   0.0,   0.0, false,
  1643.                 /* roomSize                */  10.0,   0.0, false,
  1644.                 /* roomReflectivity        */ -20.0,   0.0, false,
  1645.                 /* reverbAttenuation    */   0.0,   0.0, false,
  1646.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1647.                 /* referenceDistance    */   1.0,   0.0, false,
  1648.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1649.                 /* coneAttenuation        */   0.0,   0.0, false,
  1650.                 /* elevationDeg            */   0.0,   0.0, false,
  1651.                 /* azimuthDeg            */   0.0,   0.0, false,
  1652.                 /* distance                */   2.0,  10.0, true,
  1653.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1654.                 /* sourceVelocity        */   0.0,   0.0, false,
  1655.                 /* listenerVelocity        */   0.0,   0.0, false
  1656.         },
  1657.         { /* Reverb — Cave */
  1658.                 /* duration                */  10.0,
  1659.                 /* cpuLoad                */     0,     0, false,
  1660.                 /* medium                */ kSSpMedium_Air,
  1661.                 /* humidity                */   0.0,   0.0, false,
  1662.                 /* roomSize                */ 100.0,   0.0, false,
  1663.                 /* roomReflectivity        */ -40.0,   0.0, false,
  1664.                 /* reverbAttenuation    */  20.0,   0.0, false,
  1665.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1666.                 /* referenceDistance    */   1.0,   0.0, false,
  1667.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1668.                 /* coneAttenuation        */   0.0,   0.0, false,
  1669.                 /* elevationDeg            */   0.0,   0.0, false,
  1670.                 /* azimuthDeg            */   0.0,   0.0, false,
  1671.                 /* distance                */   2.0,  10.0, true,
  1672.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1673.                 /* sourceVelocity        */   0.0,   0.0, false,
  1674.                 /* listenerVelocity        */   0.0,   0.0, false
  1675.         },
  1676.         { /* Reverb — Stadium */
  1677.                 /* duration                */  10.0,
  1678.                 /* cpuLoad                */     0,     0, false,
  1679.                 /* medium                */ kSSpMedium_Air,
  1680.                 /* humidity                */   0.0,   0.0, false,
  1681.                 /* roomSize                */ 250.0,   0.0, false,
  1682.                 /* roomReflectivity        */ -15.0,   0.0, false,
  1683.                 /* reverbAttenuation    */  -5.0,   0.0, false,
  1684.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1685.                 /* referenceDistance    */   1.0,   0.0, false,
  1686.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1687.                 /* coneAttenuation        */   0.0,   0.0, false,
  1688.                 /* elevationDeg            */   0.0,   0.0, false,
  1689.                 /* azimuthDeg            */   0.0,   0.0, false,
  1690.                 /* distance                */   2.0,  10.0, true,
  1691.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1692.                 /* sourceVelocity        */   0.0,   0.0, false,
  1693.                 /* listenerVelocity        */   0.0,   0.0, false
  1694.         },
  1695.         { /* dividing line */ 0 },
  1696.         { /* Source Doppler */
  1697.                 /* duration                */   4.0,
  1698.                 /* cpuLoad                */     0,     0, false,
  1699.                 /* medium                */ kSSpMedium_Air,
  1700.                 /* humidity                */   0.0,   0.0, false,
  1701.                 /* roomSize                */   0.0,   0.0, false,
  1702.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1703.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1704.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1705.                 /* referenceDistance    */   1.0,   0.0, false,
  1706.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1707.                 /* coneAttenuation        */   0.0,   0.0, false,
  1708.                 /* elevationDeg            */   0.0,   0.0, false,
  1709.                 /* azimuthDeg            */   0.0,   0.0, false,
  1710.                 /* distance                */   1.0,   0.0, false,
  1711.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1712.                 /* sourceVelocity        */ -20.0,  20.0, true,
  1713.                 /* listenerVelocity        */   0.0,   0.0, false
  1714.         },
  1715.         { /* Listener Doppler */
  1716.                 /* duration                */   4.0,
  1717.                 /* cpuLoad                */     0,     0, false,
  1718.                 /* medium                */ kSSpMedium_Air,
  1719.                 /* humidity                */   0.0,   0.0, false,
  1720.                 /* roomSize                */   0.0,   0.0, false,
  1721.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1722.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1723.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1724.                 /* referenceDistance    */   1.0,   0.0, false,
  1725.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1726.                 /* coneAttenuation        */   0.0,   0.0, false,
  1727.                 /* elevationDeg            */   0.0,   0.0, false,
  1728.                 /* azimuthDeg            */   0.0,   0.0, false,
  1729.                 /* distance                */   1.0,   0.0, false,
  1730.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1731.                 /* sourceVelocity        */   0.0,   0.0, false,
  1732.                 /* listenerVelocity        */ -20.0,  20.0, true
  1733.         },
  1734.         { /* Combined Doppler */
  1735.                 /* duration                */   4.0,
  1736.                 /* cpuLoad                */     0,     0, false,
  1737.                 /* medium                */ kSSpMedium_Air,
  1738.                 /* humidity                */   0.0,   0.0, false,
  1739.                 /* roomSize                */   0.0,   0.0, false,
  1740.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1741.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1742.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1743.                 /* referenceDistance    */   1.0,   0.0, false,
  1744.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1745.                 /* coneAttenuation        */   0.0,   0.0, false,
  1746.                 /* elevationDeg            */   0.0,   0.0, false,
  1747.                 /* azimuthDeg            */   0.0,   0.0, false,
  1748.                 /* distance                */   1.0,   0.0, false,
  1749.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1750.                 /* sourceVelocity        */ -20.0,  20.0, true,
  1751.                 /* listenerVelocity        */ -20.0,  20.0, true
  1752.         },
  1753.         { /* Cancelled Doppler */
  1754.                 /* duration                */   4.0,
  1755.                 /* cpuLoad                */     0,     0, false,
  1756.                 /* medium                */ kSSpMedium_Air,
  1757.                 /* humidity                */   0.0,   0.0, false,
  1758.                 /* roomSize                */   0.0,   0.0, false,
  1759.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1760.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1761.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1762.                 /* referenceDistance    */   1.0,   0.0, false,
  1763.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1764.                 /* coneAttenuation        */   0.0,   0.0, false,
  1765.                 /* elevationDeg            */   0.0,   0.0, false,
  1766.                 /* azimuthDeg            */   0.0,   0.0, false,
  1767.                 /* distance                */   1.0,   0.0, false,
  1768.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1769.                 /* sourceVelocity        */  20.0, -20.0, true,
  1770.                 /* listenerVelocity        */ -20.0,  20.0, true
  1771.         }
  1772.     };
  1773.     
  1774.     gTestLoLevelData = preset[index];
  1775.     
  1776.     TestLoLevel_DeriveData();
  1777.     TestLoLevel_SetDialogFields();
  1778. }
  1779.  
  1780.  
  1781.